package com.lh.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * 生产者
 */
public class Product {
    public static void main(String[] args) {
        // 所有的中间件技术都是基于TCP/IP协议基础上构建的新型协议规范，只不过rabbitmq用的是AMQP协议
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置ip、端口、用户名密码、虚拟机
        factory.setHost("192.168.126.128");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            // 创建连接connection 参数是连接名称
            connection = factory.newConnection("生产者连接");
            // 通过连接创建通道channel
            channel = connection.createChannel();
            // 通过通道创建交换机、声明队列，绑定关系，路由key，发送消息、接受消息 都可以在这里做
            String queueName = "queue1";
            /**
             * params1 队列名称
             * params2 是否持久化 消费是否存盘 如果是true的话会将消息持久化 false是消息不持久化  但是即使是false也会将消息存盘 只有将服务器重启后消息才会丢失
             * params3 排他性  是否独占一个消息队列
             * params4 是否消费完消息自动删除
             * params5 其他参数
             */
            channel.queueDeclare(queueName, false, false, false, null);
            // 准备消息内容
            String message = "发送给queue1一条消息";
            // 发送消息给队列
            /**
             * params1 交换机名称  没有就填空
             * params2 队列名称
             * params3 是否进行持久化
             * params4 发送的消息
             */
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("发送消息成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
